问题:约瑟夫环
有编号从1到N的N个人坐成一圈报数,报到M的人出局,下一位再从1开始,
如此持续,直止剩下一位为止,报告此人的编号X。输入N,M,求出X。
#include <stdio.h>
struct node
{
int v;
struct node *next;
}*p,*head,h; //head是头指针,h是头结点
main()
{
int n,m;
int i;
puts("请输入人数n和报数上限m :");
scanf("%d%d",&n,&m);
h.next=NULL; //头结点的next为空
head=&h; //头指针指向头结点
p=head; //p也指向头结点
/**//*下面的循环用来建立循环链表*/
for(i=1;i<=n;i++)
{
p->next=(struct node*)malloc(sizeof(struct node));
p=p->next;
p->v=i;
if(i!=n)
{
p->next=NULL;
}
else
{
p->next=head->next;
}
}
p=head;
p=p->next; //p指向第一个结点
m%=n;//当m>n时有用
while(p!=p->next)
{
for(i=1;i<=m-2;i++)
{
p=p->next;
}
printf("%d ",p->next->v);
p->next=p->next->next;
p=p->next;
}
printf("%d",p->v);
}